查看原文
其他

Android 避免踩坑 之 7.0脱坑指南

唯鹿 鸿洋 2019-04-05

每日推荐


《AS+phoneGap+Cordova把网站打包签名成apk》

http://blog.csdn.net/qq_30552993/article/details/77319775


本文作者


作者:唯鹿

链接:

http://blog.csdn.net/qq_17766199/article/details/77404712

本文由作者授权发布。


这篇文章所写的前三个问题是自己现实遇到的,后三个是收集来的没有验证,作为记录以备不时之需。


1安装时解析错误


我们的App通常会有检查更新的功能。用户在收到提示更新并且下载完后,会自动打开安装页面让用户来去安装。这时就会出现安装错误的问题,这类的问题的可能性比较多。比如较低版本的App想要覆盖已有的较高版本App会提示安装未完成,或是签名不一致导致的。


不过7.0上常见的有以下两种情况。


1.应用间共享文件


在targetSdkVersion大于等于的24的App中,但是我们没有去适配7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配7.0或是将targetSdkVersion改为24以下(不推荐)。


适配的方法这里就不细讲,大家可以看看 Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 这篇文章。


2.APK signature scheme v2


Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。详细看安卓官方说明(https://developer.android.google.cn/about/versions/nougat/android-7.0.html#apk_signature_v2)。


简单地说就是任何方式的篡改APK 文件,在利用了V2签名的apk上会失效。

我所用的Android Studio目前是2.3.3 在 Gradle 2.2.3时。


打包页面是这样



可以看到默认是V1 和V2选中的。

1)只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式。 
2)只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式。 
3)同时勾选V1和V2则所有版本都没问题。


这里问题就来了,默认全部勾选,按道理所有版本是没有问题的。


那么我们为什么还是安装错误?


其实是因为我们项目采用了美团早期的快速生成渠道包(https://tech.meituan.com/mt-apk-packaging.html)方案。这种方案不适用于V2的签名方案。(因为实现思路就是给已有的apk文件中添加空的渠道文件)


解决办法:


1.如果你的渠道较少,可以用gradle方式的多渠道打包。渠道多的话就不适用了。


2.毕竟V2不是强制的,那么我们要用传统方案签署,可以打开模块级build.gradle 文件,然后将行v2SigningEnabled false添加到您的版本签名配置中:



或者将Gradle 升级为2.3以上。那么打包页面是这样



我们可以不勾选V2选项。


3.前两种方法是比较快速的可以解决问题,但是一旦这种安全措施被强制(毕竟我们可以感受到安卓在安全方面的努力,比如权限控制、应用间共享文件),我们怎么办。


其实美团早早发现了这个问题,具体看这篇 新一代开源Android渠道包生成工具Walle(https://tech.meituan.com/android-apk-v2-signature-scheme.html)。里面有深度的原理讲解,满满的干货。



2PopupWindow位置不正确


7.0系统的手机上,PopupWindow弹出位置不正确。


有两种可能:


1.我们使用了update方法,同时设置了Gravity(Gravity.NO_GRAVITY没事)。因为在update方法中有调用computeGravity方法去获取Gravity。(7.0以下没有获取Gravity进行更新判断)




Android 7.0 computeGravity方法源码



Android 7.1 computeGravity方法



很显然在7.0上我们设置的Gravity被覆盖了。解决就很简单了,不使用update方法。如果你真的要使用可以参考这篇文章的方法。


PopupWindow 在 Android N(7.0) 的兼容性问题

http://www.jianshu.com/p/0df10893bf5b


2.PopupWindow高度为MATCH_PARENT,在显示的时候调用showAsLocation方法时,PopupWindow并没有在指定控件的下方显示。如果使用showAsDropDown,会全屏显示。


解决方法:


1.最简单的解决方法就是指定 PopupWindow 的高度为 WRAP_CONTENT, 调用 showAsDropDown方法。

2.或者弹出时做一下判断处理(代码来自PopupWindowCompat https://github.com/tianma8023/PopupWindowCompat)



3后台优化


小伙伴们都知道在Android中有一些隐式广播,使用这些隐式广播可以做一些特定的功能,如,当手机网络变成WiFi时自动下载更新包等。 


但,这些隐式广播会在后台频繁启动已注册侦听这些广播的应用,从而带来很大的电量消耗,为缓解这一问题来提升设备性能和用户体验,在Android 7.0中删除了三项隐式广播,以帮助优化内存使用和电量消耗。


Android 7.0 应用了以下优化措施:


  • 在 Android 7.0上 应用不会收到 CONNECTIVITY_ACTION 广播,即使你在manifest清单文件中设置了请求接受这些事件的通知。 但,在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。

  • 在 Android 7.0上应用无法发送或接收 ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 类型的广播。

应对策略:Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler API 

https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
提供了一个稳健可靠的机制来安排满足指定条件(例如连入无线流量网络)时所执行的网络操作。 

您甚至可以使用 JobScheduler API 来适应内容提供程序变化。


另外,大家如果想了解更多关于后台的优化可查阅后台优化。

https://developer.android.google.cn/preview/features/background-optimization.html


移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播, 
让应用能够监控这些变更。 


由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。


以上内容来自这里

https://github.com/crazycodeboy/crazycodeboy.github.io/blob/master/_posts/2016-9-28-Android7.0适配心得.md


4其他


多语言特性


首先是官方的API指南:语言和语言区域

http://blog.csdn.net/qq_17766199/article/details/n/guide/topics/resources/multilingual-support.html

变化对比: Android 7.0多语言支持开发浅析

http://blog.csdn.net/cekiasoo/article/details/53012646

实现功能: Android 实现应用内置语言切换

http://blog.csdn.net/cekiasoo/article/details/54933135


通知栏适配


这里有一篇非常详细的通知栏介绍与适配,分享给大家:Android通知栏介绍与适配总结

http://iluhcm.com/2017/03/12/experience-of-adapting-to-android-notifications/


WebView问题


  • Android 7.0 WebView 部分机型打不开

    http://blog.csdn.net/u012347067/article/details/70829013

  • Android 7.0 WebView 二级跳转后界面空白

    http://www.jianshu.com/p/07b781795b78


最后觉得不错,点个赞吧!


又到一年的七夕了,祝大家七夕快乐,送篇旧文:



如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。


欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存